home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1997 May / EnigmA AMIGA RUN 18 (1997)(G.R. Edizioni)(IT)[!][issue 1997-05][EAR-CD II].iso / earcd / misc / emu / arosdev.lha / AROS / workbench / c / list.c < prev    next >
C/C++ Source or Header  |  1997-01-27  |  3KB  |  157 lines

  1. /*
  2.     (C) 1995-96 AROS - The Amiga Replacement OS
  3.     $Id: list.c,v 1.7 1997/01/27 00:22:37 ldp Exp $
  4.     $Log: list.c,v $
  5.     Revision 1.7  1997/01/27 00:22:37  ldp
  6.     Include proto instead of clib
  7.  
  8.     Revision 1.6  1996/09/17 16:43:00  digulla
  9.     Use general startup code
  10.  
  11.     Revision 1.5  1996/09/13 17:52:10  digulla
  12.     Use IPTR
  13.  
  14.     Revision 1.4  1996/09/12 14:49:25  digulla
  15.     More checks
  16.     Better code to specify size of buffer
  17.  
  18.     Revision 1.3  1996/08/01 17:40:45  digulla
  19.     Added standard header for all files
  20.  
  21.     Desc:
  22.     Lang:
  23. */
  24. #include <exec/memory.h>
  25. #include <proto/exec.h>
  26. #include <dos/dos.h>
  27. #include <dos/exall.h>
  28. #include <dos/datetime.h>
  29. #include <proto/dos.h>
  30. #include <utility/tagitem.h>
  31.  
  32. int main (int argc, char ** arvg)
  33. {
  34.     char *args[1]={ 0 };
  35.     struct RDArgs *rda;
  36.     BPTR dir;
  37.     LONG i;
  38.     LONG loop;
  39.     struct ExAllControl *eac;
  40.     struct ExAllData *ead;
  41.     static UBYTE buffer[4096];
  42.     UBYTE flags[9];
  43.     IPTR argv[5];
  44.     LONG error=0, rc=RETURN_OK;
  45.  
  46.     rda=ReadArgs("DIR",(IPTR *)args,NULL);
  47.     if(rda!=NULL)
  48.     {
  49.     dir=Lock(args[0]!=NULL?args[0]:"",SHARED_LOCK);
  50.     if(dir)
  51.     {
  52.         LONG files=0, dirs=0, blocks=0;
  53.         eac=AllocDosObject(DOS_EXALLCONTROL,NULL);
  54.         if(eac!=NULL)
  55.         {
  56.         eac->eac_LastKey=0;
  57.         do
  58.         {
  59.             loop=ExAll(dir,(struct ExAllData *)buffer,sizeof(buffer),ED_COMMENT,eac);
  60.             if(!loop&&IoErr()!=ERROR_NO_MORE_ENTRIES)
  61.             {
  62.             error=RETURN_ERROR;
  63.             break;
  64.             }
  65.             if(eac->eac_Entries)
  66.             {
  67.             ead=(struct ExAllData *)buffer;
  68.             do
  69.             {
  70.                 UBYTE date[LEN_DATSTRING];
  71.                 UBYTE time[LEN_DATSTRING];
  72.                 struct DateTime dt;
  73.                 dt.dat_Stamp.ds_Days  =ead->ed_Days;
  74.                 dt.dat_Stamp.ds_Minute=ead->ed_Mins;
  75.                 dt.dat_Stamp.ds_Tick  =ead->ed_Ticks;
  76.                 dt.dat_Format =FORMAT_DOS;
  77.                 dt.dat_Flags  =DTF_SUBST;
  78.                 dt.dat_StrDay =NULL;
  79.                 dt.dat_StrDate=date;
  80.                 dt.dat_StrTime=time;
  81.                 DateToStr(&dt); /* returns 0 if invalid */
  82.                 ead->ed_Prot^=0xf;
  83.                 for(i=0;i<7;i++)
  84.                 if(ead->ed_Prot&(64>>i))
  85.                     flags[i]="sparwed"[i];
  86.                 else
  87.                     flags[i]='-';
  88.  
  89.                 flags[i] = 0;
  90.  
  91.                 argv[0]=(IPTR)ead->ed_Name;
  92.                 if(ead->ed_Type>=0)
  93.                 {
  94.                 argv[1]=(IPTR)flags;
  95.                 argv[2]=(IPTR)date;
  96.                 argv[3]=(IPTR)time;
  97.                 if(VPrintf("%-25.s   <Dir> %7.s %s %s\n",argv)<0)
  98.                 {
  99.                     error=RETURN_ERROR;
  100.                     loop=0;
  101.                     break;
  102.                 }
  103.                 dirs++;
  104.                 }else
  105.                 {
  106.                 argv[1]=ead->ed_Size;
  107.                 argv[2]=(IPTR)flags;
  108.                 argv[3]=(IPTR)date;
  109.                 argv[4]=(IPTR)time;
  110.                 if(VPrintf("%-25.s %7.ld %7.s %s %s\n",argv)<0)
  111.                 {
  112.                     error=RETURN_ERROR;
  113.                     loop=0;
  114.                     break;
  115.                 }
  116.                 blocks+=ead->ed_Size;
  117.                 files++;
  118.                 }
  119.                 ead=ead->ed_Next;
  120.             }while(ead!=NULL);
  121.             }
  122.         }while(loop);
  123.         if(!error)
  124.         {
  125.             argv[0]=files;
  126.             argv[1]=dirs;
  127.             argv[2]=blocks;
  128.             if(VPrintf("%ld files - %ld directories - %ld bytes used\n",argv)<0)
  129.             error=RETURN_ERROR;
  130.         }
  131.         FreeDosObject(DOS_EXALLCONTROL,eac);
  132.         }else
  133.         {
  134.         SetIoErr(ERROR_NO_FREE_STORE);
  135.         error=RETURN_ERROR;
  136.         }
  137.         UnLock(dir);
  138.     }
  139.     else
  140.     {
  141.         PrintFault(IoErr(),"List: Lock failed");
  142.         rc = RETURN_ERROR;
  143.     }
  144.  
  145.     FreeArgs(rda);
  146.     }
  147.     else
  148.     {
  149.     error=RETURN_FAIL;
  150.     }
  151.  
  152.     if (error)
  153.     PrintFault(IoErr(),"List");
  154.  
  155.     return rc;
  156. }
  157.